package com.leo.chapter05;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 用ConcurrentHashMap代替HashMap,效率相对提高
 *  问题：1、result = c.compute(arg)是一个很耗时的操作，V result = cache.get(arg)获取为null，可能计算同一个值多次
 * @author xuexiaolei
 * @version 2017年10月14日
 */
public class Memoizer2<A, V> implements Computable<A, V> {
    private final Map<A, V> cache = new ConcurrentHashMap<>();
    private final Computable<A, V> c;//用来计算的内容，假定会浪费很长时间

    public Memoizer2(Computable<A, V> c) {
        this.c = c;
    }

    @Override public V compute(A arg) throws InterruptedException {
        V result = cache.get(arg);
        if (result == null){
            result = c.compute(arg);
            cache.put(arg, result);
        }
        return result;
    }
}
